package pe.com.rimac.portal.facturacion.controlador.actualizacion;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.bind.annotation.ActionMapping;
import org.springframework.web.portlet.bind.annotation.RenderMapping;

import pe.com.rimac.portal.facturacion.constantes.Constantes.Accion;
import pe.com.rimac.portal.facturacion.constantes.Constantes.ParametroRequest;
import pe.com.rimac.portal.facturacion.constantes.Constantes.Vista;
import pe.com.rimac.portal.facturacion.modelo.PersonaJuridica;
import pe.com.rimac.portal.facturacion.modelo.PersonaNatural;
import pe.com.rimac.portal.facturacion.servicio.AseguradoService;

/**
 * Clase encargada de manejar todos los eventos realizados en la pantalla de Consulta de Documentos Electr&eacute;nicos.
 * 
 * @author Andres Deza Villacorta - Synopsis S.A
 * 
 */
@Controller(value = "actualizacionController")
@RequestMapping("VIEW")
public class ActualizacionController
{
	private static final Logger logger = Logger.getLogger(ActualizacionController.class);
	@Autowired
	@Qualifier("personaValidator")
	private Validator personaValidator;
	@Autowired
	private AseguradoService aseguradoService;
	public static final String MODEL = "model";
	public static final String COMMAND_CLASS = "actualizacionCommand";

	/**M&eacute;todo encargado de realizar la actualizaci&oacute;n de datos de persona natural.
	 * 
	 * @param command
	 * @param bindingResult
	 * @param request
	 * @param response
	 */
	@ActionMapping(params = "accion=" + Accion.ACCION_ACTUALIZAR_PERSONA_NATURAL)
	public void actualizarPersonaNatural(@ModelAttribute(value = COMMAND_CLASS) PersonaNatural command,
			BindingResult bindingResult, ActionRequest request, ActionResponse response)
	{
		logger.debug("actualizarPersonaNatural method");
		personaValidator.validate(command, bindingResult);
		if (!bindingResult.hasErrors())
		{
			aseguradoService.actualizarDatosFacturacion(command);
			response.setRenderParameter(ParametroRequest.PARAMETRO_ACCION,
					ParametroRequest.REGISTRO_EXITOSO_PERSONA_NATURAL);
		}
	}

	/**
	 * M&eacute;todo encargado de realizar la actualizaci&oacute;n de datos de persona jur&iacute;dica.
	 * 
	 * @param command
	 * @param bindingResult
	 * @param request
	 * @param response
	 */
	@ActionMapping(params = "accion=" + Accion.ACCION_ACTUALIZAR_PERSONA_JURIDICA)
	public void actualizarPersonaJuridica(@ModelAttribute(value = COMMAND_CLASS) PersonaJuridica command,
			BindingResult bindingResult, ActionRequest request, ActionResponse response)
	{
		logger.debug("actualizarPersonaJuridica method");
		personaValidator.validate(command, bindingResult);
		if (!bindingResult.hasErrors())
		{
			response.setRenderParameter(ParametroRequest.PARAMETRO_ACCION,
					ParametroRequest.REGISTRO_EXITOSO_PERSONA_JURIDICA);
		}
	}

	/**
	 * Obtiene un nuevo command para persona natural o jur&iacute;dica.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	@ModelAttribute(COMMAND_CLASS)
	public Object getCommandObject(PortletRequest request, PortletResponse response)
	{
		logger.debug("getCommandObject method");
		request.removeAttribute(MODEL);
		if (esPersonaNatural(request, response))
		{
			return new PersonaNatural();
		}
		return new PersonaJuridica();
	}

	/**
	 * Muestra el formulario de actualizaci&oacute;n de datos.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	@RenderMapping
	public String mostrarFormularioActualizacion(RenderRequest request, RenderResponse response)
	{
		logger.debug("mostrarFormularioActualizacion method");
		Object command = getCommandObject(request, response);
		request.setAttribute(MODEL, command);
		if (esPersonaNatural(request, response))
		{
			return Vista.VISTA_ACTUALIZACION_DATOS_PN;
		}
		return Vista.VISTA_ACTUALIZACION_DATOS_PJ;
	}

	/**
	 * Muestra la pantalla de confirmaci&oacute;n de actualizaci&oacute;n de datos de persona natural.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	@RenderMapping(params = "accion=" + ParametroRequest.REGISTRO_EXITOSO_PERSONA_NATURAL)
	public String actualizacionPersonaNaturalSatisfactoria(RenderRequest request, RenderResponse response)
	{
		logger.debug("actualizacionPersonaNaturalSatisfactoria method");
		return Vista.VISTA_ACTUALIZACION_DATOS_SATISFACTORIA;
	}

	/**
	 * Muestra la pantalla de confirmaci&oacute;n de actualizaci&oacute;n de datos de persona jur&iacute;dica.
	 * @param request
	 * @param response
	 * @return
	 */
	@RenderMapping(params = "accion=" + ParametroRequest.REGISTRO_EXITOSO_PERSONA_JURIDICA)
	public String actualizacionPersonaJuridicaSatisfactoria(RenderRequest request, RenderResponse response)
	{
		logger.debug("actualizacionPersonaJuridicaSatisfactoria method");
		return Vista.VISTA_ACTUALIZACION_DATOS_SATISFACTORIA;
	}

	/**
	 * M&eacute;todo que eval&uacute;a si el usuario autenticado en el portal es una persona natural o jur&iacute;dica.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	private boolean esPersonaNatural(PortletRequest request, PortletResponse response)
	{
		logger.debug("esPersonaNatural method");
		return (StringUtils.length(request.getRemoteUser()) < 11);
	}
}